import pandas
import jieba
import jieba.analyse

# 读取csv文件
df = pandas.read_csv("static/data/sight_pre.csv")


# 定义函数geo_plot_data，用于获取地图数据
def geo_plot_data():
    # 获取经度大于0且纬度大于0的行
    df_point = df[(df['longitude'] > 0) & (df['latitude'] > 0)]
    # 返回地图数据
    return {
        'data': [{'name': i[0], 'value': i[1].split(',')} for i in df_point[['name', 'point']].values.tolist()]
    }


# 定义函数word_cloud_data，用于生成词云数据
def word_cloud_data():
    # 使用jieba对df中intro列的值进行分词，并去除标点符号
    word_cut = " ".join([
        " ".join(jieba.lcut(i))
        .replace('、', '')
        .replace('。', '')
        .replace('，', '')
        .replace('\r\n', '')
        for i in df[df['intro'] != '无']['intro'].values.tolist()
    ])
    # 使用jieba分析word_cut，提取前20个词，并计算权重
    word_counts = jieba.analyse.extract_tags(word_cut, topK=20, withWeight=True)
    # 返回一个字典，其中包含提取的词及其权重
    return {
        'data': [{'name': i[0], 'value': round(i[1] * 100, 2)} for i in word_counts]
    }


# 定义一个名为funnel_data的函数
def funnel_data():
    # 从df中取出score大于3的数据
    score = df[df['score'] > 3]
    # 从score中取出star不为无的数据
    star = score[score['star'] != '无']
    # 从star中取出sale_count大于1000的数据
    sc = star[star['sale_count'] > 1000]
    # 返回一个字典，其中包含data和max两个键
    return {
        'data': [
            {'name': '总数', 'value': len(df)},
            {'name': '评分大于3', 'value': len(score)},
            {'name': '3A级以上', 'value': len(star)},
            {'name': '售票量大于1000', 'value': len(sc)},
        ],
        'max': len(df)
    }


# 定义一个函数sale_count_bar_data，用于获取销售数量柱状图的数据
def sale_count_bar_data():
    # 根据销售数量对df进行排序，取前10行
    sale_count_desc = df.sort_values(by="sale_count", ascending=False).head(10)
    # 返回标签和销售数量的列表
    return {
        'label': [i for i in sale_count_desc['name'].values],
        'value': [int(i) for i in sale_count_desc['sale_count'].values]
    }


# 定义一个函数，用于获取分数降序排列的前10个数据
def score_desc_bar_data():
    # 对df按照score列进行降序排列，取前10行
    score_desc = df.sort_values(by="score", ascending=False).head(10)
    # 返回一个字典，其中label为name列的值，value为score列的值
    return {
        'label': [i for i in score_desc['name'].values],
        'value': [float(i) for i in score_desc['score'].values]
    }


# 定义一个函数star_pie_data
def star_pie_data():
    # 使用groupby函数对df中的name和star进行分组，并计算每个明星的粉丝数
    star_count = df.groupby("star")['name'].count().reset_index()
    # 返回一个字典，其中包含每个明星的粉丝数
    return {
        'data': [{'name': i[0], 'value': i[1]} for i in star_count.values]
    }


def month_person_count_rate_plot():
    month_person_count_rate = df.groupby('月份')['接待人数(万人次)'].sum().reset_index()
    return {
        'data': [{'name': i[0], 'value': round(i[1], 1)} for i in month_person_count_rate.values.tolist()]
    }


def revenue_rate_plot():
    revenue_rate = [
        {
            'name': '门票收入(万元)',
            'value': round(df['门票收入(万元)'].sum(), 1)
        },
        {
            'name': '商品销售收入(万元)',
            'value': round(df['商品销售收入(万元)'].sum(), 1)
        },
        {
            'name': '其他收入(万元)',
            'value': round(df['其他收入(万元)'].sum(), 1)
        },

    ]
    return {
        'data': revenue_rate
    }


def month_revenue_trend_plot():
    month_revenue_trend = [df[df['年'] == i].sort_values('月份')['营业收入(万元)'].values.tolist() for i in
                           df['年'].unique()]
    month = df['月份'].unique().tolist()
    return {
        'label': month,
        'value': month_revenue_trend
    }


def person_count_rank_plot():
    person_count_rank = df[df['年'] == '2023年'].sort_values('接待人数(万人次)', ascending=False)
    return {
        'label': person_count_rank['月份'].tolist(),
        'value': person_count_rank['接待人数(万人次)'].tolist()
    }


def year_on_year_growth_rate():
    year_on_year_growth_revenue_rate = (df[df['年'] == '2023年']['营业收入(万元)'].sum() - df[df['年'] == '2022年'][
        '营业收入(万元)'].sum()) / df[df['年'] == '2022年']['营业收入(万元)'].sum()
    year_on_year_growth_person_rate = (df[df['年'] == '2023年']['接待人数(万人次)'].sum() - df[df['年'] == '2022年'][
        '接待人数(万人次)'].sum()) / df[df['年'] == '2022年']['接待人数(万人次)'].sum()
    return {
        'label': ['年营业收入', '年接待人数'],
        'value': [round(year_on_year_growth_revenue_rate * 100, 1), round(year_on_year_growth_person_rate * 100, 1)]
    }


def month_person_count_radar_plot():
    month_person_count_radar = [df[df['年'] == i]['接待人数(万人次)'].values.tolist() for i in df['年'].unique()]
    month = df['月份'].unique().tolist()
    count_max = df['接待人数(万人次)'].max()
    return {
        'label': month,
        'value': month_person_count_radar,
        'max': 10 ** (len(str(int(count_max))) - 1) * (int(str(int(count_max))[0]) + 1)
    }
